<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Session;

/**
 * 用户模拟控制器
 * 用于管理员快速切换登录到其他用户账号的功能
 */
class ImpersonateController extends Controller
{
    /**
     * 构造函数
     */
    public function __construct()
    {
        // 确保用户已登录
        $this->middleware('auth');
    }
    
    /**
     * 开始模拟指定用户
     *
     * @param int $id 要模拟的用户ID
     * @return \Illuminate\Http\Response
     */
    public function impersonate($id)
    {
        // 检查当前用户是否已登录且是管理员
        if (!Auth::check() || !Auth::user()->canImpersonate()) {
            return redirect()->route('login')->with('error', '未授权的操作');
        }

        // 获取要模拟的用户
        $user = User::findOrFail($id);

        // 不能模拟自己
        if (Auth::id() == $user->id) {
            return redirect()->back()->with('error', '不能模拟自己的账号');
        }

        // 检查目标用户是否可以被模拟
        if (!$user->canBeImpersonated()) {
            return redirect()->back()->with('error', '无法模拟该账号');
        }

        try {
            // 执行模拟操作
            $result = Auth::user()->impersonate($user);

            if ($result) {
                return redirect()->route('blog.home')->with('success', '现在以 ' . $user->name . ' 的身份登录');
            } else {
                return redirect()->back()->with('error', '模拟登录失败');
            }
        } catch (\Exception $e) {
            // 记录到日志
            Log::error('模拟用户失败', [
                'error' => $e->getMessage(),
                'file' => $e->getFile(),
                'line' => $e->getLine(),
                'trace' => $e->getTraceAsString(),
                'admin_id' => Auth::id(),
                'user_id' => $user->id
            ]);

            return redirect()->back()->with('error', '模拟失败：' . $e->getMessage());
        }
    }
    
    /**
     * 结束模拟，返回到原始用户
     *
     * @return \Illuminate\Http\Response
     */
    public function leave()
    {
        // 检查是否在模拟中
        if (!session()->has('impersonated_by')) {
            return redirect()->back()->with('error', '当前没有在模拟其他用户');
        }

        try {
            // 获取当前用户
            $user = Auth::user();

            if (!$user->isImpersonated()) {
                return redirect()->back()->with('error', '当前没有在模拟其他用户');
            }

            // 结束模拟
            $user->leaveImpersonation();

            return redirect()->route('admin.permissions.users')->with('success', '已返回您的账号');
        } catch (\Exception $e) {
            // 记录到日志
            Log::error('退出模拟失败', [
                'error' => $e->getMessage(),
                'file' => $e->getFile(),
                'line' => $e->getLine(),
                'trace' => $e->getTraceAsString(),
                'user_id' => Auth::id()
            ]);

            return redirect()->back()->with('error', '退出模拟失败：' . $e->getMessage());
        }
    }
}
